#pragma once

namespace x3
{
// RGBA
#define HF_RGBA_GET_R(c)	(( c & Oxff000000) >> 24)
#define HF_RGBA_GET_G(c)	((c  & 0x00ff0000) >> 16)
#define HF_RGBA_GET_B(c)	((c & 0x0000ff00) >> 8)
#define HF_RGBA_GET_A(c)	(c & 0x000000ff)

// ARGB
#define HF_ARGB_GET_A(c)	((c & 0xff000000) >> 24)
#define HF_ARGB_GET_R(c)	((c & 0x00ff0000) >> 16)
#define HF_ARGB_GET_G(c)	((c & 0x0000ff00) >> 8)
#define HF_ARGB_GET_B(c)	(c & 0x000000ff)

// HF Engine
#define HF_RGBA(r, g, b, a)	((((int)r)<<24)|(((int)g)<<16)|(((int)b)<<8)|((int)a))
#define HF_ARGB(a, r, g, b)	((((int)a)<<24)|(((int)r)<<16)|(((int)g)<<8)|((int)b))
#define HF_ABGR(a, b, g, r) ((((int)a)<<24)|(((int)b)<<16)|(((int)g)<<8)|((int)r))

// Float-To-Byte or vice versa
#define HF_COLOR_FTOB(f)	((unsigned char)(f*255) )
#define HF_COLOR_BTOF(b)	((float)(b/255.0))

#define HF_RGBA_FLOAT(fr, fg, fb, fa)	\
	HF_RGBA(HF_COLOR_FTOB(fr),\
	HF_COLOR_FTOB(fg),\
	HF_COLOR_FTOB(fb),\
	HF_COLOR_FTOB(fa))
#define HF_ARGB_FLOAT(fa, fr, fg, fb)	\
	HF_ARGB(HF_COLOR_FTOB(fa),\
	HF_COLOR_FTOB(fr),\
	HF_COLOR_FTOB(fg),\
	HF_COLOR_FTOB(fb))

typedef unsigned char Transparency;
typedef unsigned RGBA;

struct RGB
{
	unsigned char r,g,b;
	RGB() { r = g = b = 255;}
	RGB( unsigned char rr, unsigned char gg, unsigned char bb ):r(rr),g(gg),b(bb){}
};

}